﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Input;
using personalplaner.business.extensions;
using personalplaner.business.stamm;
using personalplaner.common.mvvm;
using personalplaner.common.mvvm.commands;
using personalplaner.common.mvvm.common;
using personalplaner.servicemodel.dataaccess;
using personalplaner.gui.common;
using personalplaner.business;


namespace personalplaner.gui.stamm.viewmodels
{
    public class AbteilungStammViewModel : BaseViewModel
    {
        public AbteilungStammViewModel(DependencyObject parent)
            : base(parent)
        {
        }

		public override void Loaded()
		{
			var mw = GetService<IMainWindowDisplayContainer>();
			mw.IsWaitVisible = false;
		}

        #region Commands

        ICommand _okcommand;
        public ICommand OkCommand
        {
            get
            {
                if (_okcommand == null)
                    _okcommand = new RelayCommand(OnOkCommand);
                return _okcommand;
            }
        }

        private void OnOkCommand(object parameter)
        {
			var wnd = Parent as Window;
			if (wnd != null)
			{
				wnd.DialogResult = true;
				wnd.Close();
				return;
			}

			var mw = GetService<IMainWindowDisplayContainer>();
			mw.MoveToPreviousView();
        }

        ICommand _cancelcommand;
        public ICommand CancelCommand
        {
            get
            {
                if (_cancelcommand == null)
                    _cancelcommand = new RelayCommand(OnCancelCommand);
                return _cancelcommand;
            }
        }

        private void OnCancelCommand(object parameter)
        {
			var wnd = Parent as Window;
			if (wnd != null)
			{
				wnd.DialogResult = false;
				wnd.Close();
				return;
			}

			var mw = GetService<IMainWindowDisplayContainer>();
			mw.MoveToPreviousView();
        }

        ICommand _savecommand;
        public ICommand SaveCommand
        {
            get
            {
                if (_savecommand == null)
                    _savecommand = new RelayCommand(OnSave, parameter => SelectedAbteilung != null && SelectedAbteilung.IsValid);
                return _savecommand;
            }
        }

        private void OnSave(object parameter)
        {
            if (SelectedAbteilung == null || !SelectedAbteilung.IsValid)
            {
                MessageBox.Show(Window.GetWindow(Parent),
                    "Bitte füllen Sie alle Felder aus.",
                    "",
                    MessageBoxButton.OK,
                    MessageBoxImage.Exclamation);
                return;
            }

			//Update
			if (!SelectedAbteilung.IsNew)
			{
				var da = GetService<IAbteilungDataAccess>();
				if (!da.UpdateAbteilung(SelectedAbteilung))
				{
					MessageBox.Show(Window.GetWindow(Parent),
					                string.Format("Beim Speichern der Abteilung : {0} ist ein Fehler aufgetreten!", SelectedAbteilung.Name),
					                "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
					return;
				}
			}
			else
			{
				var da = GetService<IAbteilungDataAccess>();
				if (!da.SetAbteilung(SelectedAbteilung))
				{
					MessageBox.Show(Window.GetWindow(Parent),
									string.Format("Beim Speichern der Abteilung : {0} ist ein Fehler aufgetreten!", SelectedAbteilung.Name),
									"Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
					return;
				}

                SelectedAbteilung.AbteilungID = da.GetAbteilungId(SelectedAbteilung.Name);
                SelectedAbteilung.ID = SelectedAbteilung.AbteilungID;
				Abteilungen.Add(SelectedAbteilung);
			}

			for (int i = 0; i < Abteilungen.Count; i++)
			{
				if (Abteilungen[i].AbteilungID == SelectedAbteilung.AbteilungID)
				{
					Abteilungen[i] = SelectedAbteilung;
					ActiveGridItem = SelectedAbteilung;
					break;
				}
			}
        }

        ICommand _newcommand;
        public ICommand NewCommand
        {
            get
            {
                if (_newcommand == null)
                    _newcommand = new RelayCommand(OnNew);
                return _newcommand;
            }
        }

        private void OnNew(object parameter)
        {
            ActiveGridItem = null;
            SelectedAbteilung = new Abteilung();

            RaiseMoveFocus("Name");
        }

		ICommand _deleteCommand;
		public ICommand DeleteCommand
        {
            get
            {
				if (_deleteCommand == null)
					_deleteCommand = new RelayCommand(OnDelete, param => SelectedAbteilung != null && !SelectedAbteilung.IsNew);
				return _deleteCommand;
            }
        }

		private void OnDelete(object parameter)
		{
			if (SelectedAbteilung.IsNew)
			{
				MessageBox.Show("Die Abteilung kann nicht gelöscht werden da diese noch nicht existiert!", "",
				                MessageBoxButton.OK);
				return;
			}

			var da = GetService<IAbteilungDataAccess>();
			if (da.GetIsAbteilungUsed(SelectedAbteilung.AbteilungID))
			{
				MessageBox.Show(Window.GetWindow(Parent),
								"Die Abteilung kann nicht gelöscht werden da diese bereits in einem Plan verwendet wird.",
				                "Abteilung löschen",
				                MessageBoxButton.OK,
				                MessageBoxImage.Asterisk);
				return;
			}

			if (MessageBox.Show(Window.GetWindow(Parent),
			                    string.Format("Sind Sie sicher dass Sie die Abteilung:\n{0}\nlöschen möchten?", SelectedAbteilung.Name),
			                    "Abteilung löschen?",
			                    MessageBoxButton.YesNo) == MessageBoxResult.OK)
			{
				if (!da.DeleteAbteilung(SelectedAbteilung.AbteilungID))
				{
					MessageBox.Show(Window.GetWindow(Parent), string.Format("Die Abteilung : {0} konnte nicht gelöscht werden!", SelectedAbteilung.Name), "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
					return;
				}

				SelectedAbteilung = null;
				ActiveGridItem = null;
				Abteilungen = null;
			}
		}



    	#endregion

        #region Properties

        IList<Abteilung> _abteilungen;
        public IList<Abteilung> Abteilungen
        {
            get
            {
                if (Designer.IsDesignMode)
                    return new List<Abteilung>();

                if (_abteilungen == null)
                {
                    //get the data access via the service locator.
                    var da = GetService<IAbteilungDataAccess>();
                    _abteilungen = new ObservableCollection<Abteilung>(da.GetAbteilungen());
                }
                return _abteilungen;
            }
			set
			{
				_abteilungen = value;
				RaisePropertyChanged("Abteilungen");
			}
        }

        Abteilung _activegriditem;
        public Abteilung ActiveGridItem
        {
            get
            {
                return _activegriditem;
            }
            set
            {
                _activegriditem = value;
                RaisePropertyChanged("ActiveGridItem");

                if (value == null)
                {
                    SelectedAbteilung = null;
                    return;
                }

                SelectedAbteilung = value.Clone<Abteilung>();
            }
        }

        Abteilung _selectedAbteilung;
        public Abteilung SelectedAbteilung
        {
            get
            {
                return _selectedAbteilung;
            }
            set
            {
                _selectedAbteilung = value;
                RaisePropertyChanged("SelectedAbteilung");
                RaisePropertyChanged("IsEditEnabled");
            }
        }

        public bool IsEditEnabled
        {
            get
            {
                return SelectedAbteilung != null;
            }
        }

        #endregion
    }
}
